package com.zjsru.plan2023.oneday;

/**
 * @Author: cookLee
 * @Date: 2023-12-09
 * 下一个更大的数值平衡数
 */
public class NextBeautifulNumber {

    /**
     * 主
     * \
     * 输入：n = 1
     * 输出：22
     * 解释：
     * 22 是一个数值平衡数，因为：
     * - 数字 2 出现 2 次
     * 这也是严格大于 1 的最小数值平衡数。
     * \
     * 输入：n = 1000
     * 输出：1333
     * 解释：
     * 1333 是一个数值平衡数，因为：
     * - 数字 1 出现 1 次。
     * - 数字 3 出现 3 次。
     * 这也是严格大于 1000 的最小数值平衡数。
     * 注意，1022 不能作为本输入的答案，因为数字 0 的出现次数超过了 0 。
     * \
     * @param args
     */
    public static void main(String[] args) {
        NextBeautifulNumber nextBeautifulNumber = new NextBeautifulNumber();
        int n  = 1000;
        System.out.println(nextBeautifulNumber.nextBeautifulNumber(n));
    }

    /**
     * 枚举
     * @param n
     * @return int
     */
    public int nextBeautifulNumber(int n) {
        //从给定的N开始寻找符合条件的最小值，边界值为1224444，能达到的最大值
        for (int i = n + 1; i <= 1224444; ++i) {
            if (this.helper(i)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 获取符合条件的助手类
     *
     * @param i 我
     * @return boolean
     */
    private boolean helper(int i) {
        //记录十个个位数
        int[] cnt = new int[10];
        while (i > 0) {
            //获取数字字符串的最后一位
            int count = i % 10;
            cnt[count]++;
            //缩短原字符串
            i = i / 10;
        }
        //对数字判断是否符合条件
        for (int j = 0; j < cnt.length; j++) {
            //如果存在数字个数和数量匹配不上则返回false
            if (cnt[j] > 0 && cnt[j] != j) {
                return false;
            }
        }
        return true;
    }
}
